[レポート] DEV309: サーバレスとコンテナ化されたアプリケーションのためのCI/CD #reinvent
はじめに
本記事はAWS re:Invent 2018 「CI/CD for Serverless and Containerized Applications」のレポートです。
To get the most out of the agility afforded by serverless and containers, it is essential to build CI/CD pipelines that help teams iterate on code and quickly release features. In this talk, we demonstrate how developers can build effective CI/CD release workflows to manage their serverless or containerized deployments on AWS. We cover infrastructure-as-code (IaC) application models, such as AWS Serverless Application Model (AWS SAM) and new imperative IaC tools. We also demonstrate how to set up CI/CD release pipelines with AWS CodePipeline and AWS CodeBuild, and we show you how to automate safer deployments with AWS CodeDeploy.
セッションのアジェンダは以下となります。
- 現代的なアプリケーションのためのCI/CD
- CI
- CD
- Infrastructure as code
- デモ
スピーカー
Clare Liguori - Principal Engineer
レポート
現代的なアプリケーションって何?
現代的なアプリケーション開発のアプローチ
- シンプルな環境管理
- サーバーレス
- コードの変更に対するインパクトを減らす
- マイクロサービス
- オペレーション自動化
- モデル化されたアプリケーションとコード化されたインフラ
- 新しく高品質なサービスの提供を高速化
- CI/CD
- リソースとアプリケーション間の見識を増やす
- Observability
- 顧客とビジネスを保護
- End to Endのセキュリティとコンプライアンス
サーバーレス/マイクロサービス
- AWS Lambda
- イベントドリブン
- 多くの言語のランタイム
- データソースとの統合
- サーバ管理不要
- AWS Fargate
- 長時間の実行が可能
- OSを抽象化
- フルマネジメントなオーケストレーション
- フルマネジメントなクラスタのスケール
CI/CD
リリースの各ステージには、ソースコード、ビルド、テスト、プロダクションがある。 ソースコード、ビルドがCIの領域、CDはソースコードからプロダクションまで。
- ソースコード
- コードそのもののチェックイン
- レビュー
- ビルド
- コンパイル
- ユニットテスト
- コードスタイルのチェック
- コンテナイメージ/関数用のデプロイパッケージの作成
- テスト
- 他のシステムとの統合テスト
- 負荷テスト
- UIのテスト
- セキュリティのテスト
- プロダクション
- 本番環境へのデプロイ
- モニタリングと素早いエラー検知
CI/CDの効果は、頻繁なデプロイ、リードタイムの短縮、失敗率の低下にある。
CIのゴール
- コードのチェックインに伴う新しいリリースのキックオフを自動化
- 再現性のある環境でのビルドおよびテスト
- 継続的なデプロイのための成果物一式作成
- ビルドが失敗した場合の継続的なフィードバックループ
AWS CodePipeline
- 素早く信頼できるアプリケーションのアップデートのためのCDサービス
- リリースプロセスの可視化とモデル化
- コードの変更ごとにビルド、テスト、デプロイ
- サードパーティツールやAWSとの統合
最新のコードの取得とリリースのキックオフのために以下のソースをサポートします。
- ブランチ
- AWS CodeCommit
- GitHub
- オブジェクト/フォルダ
- Amazon S3
- コンテナ
- Amazon ECR(NEW!)
サポートしているトリガーは以下。
- Amazon CloudWatch Events
- 定期実行
- AWS Health Event
- Webhooks
- DockerHub
- Quay
- Artifactory
AWS CodeBuild
- フルマネジメントなビルドサービス
- コンパイル、テスト、パッケージの提供
- 継続的なスケールと同時に複数のビルドを実行
- ビルド用サーバの管理不要
- 従量課金
- CloudWatch Eventsによるビルドのモニタリング
- 再現性のあるイミュータブルな環境のために、ビルドごとに新しいDockerコンテナを利用
- オフィシャルなCodeBuildのイメージではDockerとAWS CLIがインストール済み
- 必要に応じてCustom Build Environmentを提供
CDのゴール
- テストのために自動的なステージング環境へのデプロイ
- 顧客への影響を与えず安全に本番環境へデプロイ
- 頻繁にデプロイを行いアップデートを素早く顧客へ提供
AWS CodeDeploy
- インスタンスやLambdaへ自動でコードをデプロイ
- アプリケーションのアップデートの複雑さをハンドリング
- 開発中のダウンタイムを避ける
- 失敗を検知した際に自動でロールバック
- EC2、Lambda、オンプレへのデプロイ
Lambdaへのデプロイ
- エイリアスを利用したトラフィックの移行
- カナリアリリース(10分間トラフィックの10パーセントを移行など)もしくはリニアリリース(10分ごとに10パーセントずつトラフィックを移行)の選択
- バリデーションのフックによりデプロイの各ステージでテストが可能
- フックもしくはCloudWatch alermsによる素早いロールバック
- コンソール、API、SNS、CloudWatch Eventsによるデプロイのステータスとヒストリのモニタリング
FargateとECSへのbrue-greenデプロイ(NEW!)
- greenのプロビションに伴い、ロードバランサーでトラフィックを移行
- バリデーションのフックによりデプロイの各ステージでテストが可能
- フックもしくはCloudWatch alermsによるblueへの素早いロールバック
- CodePipelineやJenkinsでのCodeDeploy-ECSデプロイアクションの利用
greenを配備して
greenにテスト用のトラフィックを流して
トラフィックをgreenに移行もしくはロールバック
blueを切り離す
Infrastructure as codeのゴール
- 再現性のあり、予期しないイベントの起きないインフラ
- ツールを使ったインフラのリリース
- 継続的なテストのため本番と同様の環境をステージング環境にコピー
Infrastructure as codeで継続的なテスト
成果物へのテスト(ビルドステージ)
- ユニットテスト
- 静的解析
- 依存関係と環境のモック化
- イメージの脆弱性スキャン
環境のテスト(テストステージ)
- 本物の依存関係と環境での統合テスト
- 負荷テスト
- ペネトレーションテスト
- 環境へのデプロイの影響をテストするためのモニタリング
AWS SAMによるファンクション環境のモデル化
- AWSに構築されたサーバレスアプリケーション構築のためのOSSフレームワーク
- ファンクション、API、データベース、イベントソースのマッピングを表現するための簡潔なシンタックス
- デプロイ時にSAMのシンタックスをCloudFormationのシンタックスに展開
- 全てのCloudFormationリソース型をサポート
AWS CDKによるコンテナ環境のモデル化(NEW!)
- Typescriptでクラウドのインフラを定義できるOSSフレームワーク
- デフォルトでAWSのベストプラクティスが組み込まれたハイレベルなリソース型のライブラリをnpm modulesとして提供
CDKを使ったパイプラインのモデル化
- オブジェクト指向言語によるコピペ最小化
- 一つのクラスでマイクロサービスのパイプラインを定義し、複数のパイプラインで再利用
- CodePipelineのパイプラインのモデル化や、IAM roleポリシーの設定自動化のためのハイレベルなコンストラクタを含む